class Incidente < ActiveRecord::Base
  has_many :planes_acciones, :as=>:clase

  belongs_to :funcionario, :class_name => "Usuario", :foreign_key => "funcionario_id"
  belongs_to :identificador, :class_name => "Usuario", :foreign_key => "identificador_id"
  belongs_to :registrador, :class_name => "Usuario", :foreign_key => "registrador_id"
  belongs_to :superior, :class_name => "Usuario", :foreign_key => "superior_id"
  validates_presence_of :descripcion
  belongs_to :hecho
  belongs_to :tarea
  belongs_to :factor_reconocimiento
  belongs_to :premiacion
  accepts_nested_attributes_for :premiacion
  default_scope :order => 'fecha, created_at'
  named_scope :por_anho, lambda{|inicio|{:conditions =>["fecha >=? AND fecha <=?",inicio,inicio.end_of_year]} }
  named_scope :por_periodo, lambda{|inicio,fin|{:conditions =>["fecha >=? AND fecha <=?",inicio,fin]}}
  named_scope :antes_del, lambda{|fecha|{:conditions =>["fecha < ?",fecha]}}
  named_scope :hechos_habilitados, lambda{|fecha,funcionario_id|{:conditions =>["fecha <= ? and funcionario_id = ? and premiacion_id is null and factor_reconocimiento_id is not null and hecho_id is not null",fecha,funcionario_id]}}
  named_scope :positivos, lambda {{:joins => :hecho, :conditions => ["puntos > 0"]} }
  named_scope :negativos, lambda {{:joins => :hecho, :conditions => ["puntos < 0"]} }
  named_scope :por_usuario_id_y_cargos_subordinados_id, lambda {|usuario_id,cargos_subordinados_id| {:joins => :funcionario,:conditions=>["funcionario_id = ? or usuarios.cargo_id in (?)",usuario_id,cargos_subordinados_id]}  }
  named_scope :por_cargos_subordinados_id, lambda {
    |cargos_subordinados_id_sucursal_id| {:joins => :funcionario,
      :conditions=>["usuarios.cargo_id in (?) and usuarios.sucursal_id=?",cargos_subordinados_id_sucursal_id[0],cargos_subordinados_id_sucursal_id[1]]}
  }
  named_scope :por_usuario_id, lambda {|usuario_id| {:joins => :funcionario,:conditions=>["funcionario_id = ?",usuario_id]} }

  named_scope :para_consumir_puntos,lambda {|fecha| { :conditions=>["fecha <= ? and retiro_premio is null and factor_reconocimiento_id is not null and hecho_id is not null",fecha]}}

  #para popup_select
  attr_writer :funcionario_nombre, :identificador_nombre, :hecho_nombre, :tarea_nombre,:factor_reconocimiento_nombre
  #delegate :nombre, :to => :hecho, :prefix => true, :allow_nil => true
  delegate :email, :to => :funcionario,   :prefix => true
  delegate :email, :to => :identificador, :prefix => true
  delegate :email, :to => :registrador,  :prefix => true
  delegate :email, :to => :superior,  :prefix => true,:allow_nil => true
  delegate :puntos, :to => :hecho,:prefix=>true,:allow_nil => true
  delegate :peso, :to => :factor_reconocimiento,:prefix=>true,:allow_nil => true
 # delegate :nombre, :to => :factor_reconocimiento,:prefix=>true,:allow_nil => true
  delegate :descripcion, :to => :factor_reconocimiento,:prefix=>true,:allow_nil => true
  #delegate :nombre, :to => :factor_reconocimiento,:prefix=>true,:allow_nil => true

  after_update :cosumir_puntos


  def puntuacion_acumulada
    puntuacion_por_incidentes=premiacion_id ? premiacion.incidentes.hechos_habilitados(fecha,funcionario_id).all.sum(&:puntuacion_registrada) : hechos_habilitados.sum(&:puntuacion)  
    puntuacion_por_incidentes+=premiaciones_anteriores.sum(&:puntos_acumulados)
    puntuacion_por_incidentes
  end
  
  def premiaciones_anteriores
    Premiacion.antes_del(fecha).puntos_acumulados_mayor_a(0).con_puntos_acumulados_disponibles.all
  end
  def hechos_habilitados
    Incidente.hechos_habilitados(fecha,funcionario_id).all
  end

  def nivel_premiacion
    nivel=PuntuacionEscala.contiene_a(puntuacion_acumulada).find_by_escalable_type('PremiacionEscala')   
    if nivel.nil?
      escala_maxima=PuntuacionEscala.find_all_by_escalable_type('PremiacionEscala').last
      nivel=escala_maxima if escala_maxima.desde<=puntuacion_acumulada
    end
    nivel
  end

  def nivel_nombre
    (premiacion.try(:nivel_nombre) || nivel_premiacion.try(:nombre)) || 'Puntaje por debajo del minimo'
  end

  def nivel_escala(sep=' / ')
    nivel_premiacion ? "#{nivel_premiacion.desde}#{sep}#{nivel_premiacion.hasta}" : '- - - - -'
  end


  def puntuacion
    puntuacion_registrada || puntos*peso
  end

  def puntos
    hecho_puntos || 0
  end

  def peso
    factor_reconocimiento_peso || 0
  end

  def hecho_nombre
    hecho.try(:nombre) || 'No se ha seleccionado un hecho'
  end

  def factor_reconocimiento_nombre
      factor_reconocimiento.try(:nombre) || 'No se ha seleccionado un factor'
  end

  def tarea_nombre
    self.tarea.try(:descripcion)
  end

  def identificador_nombre
    self.identificador.try(:nombre)
  end

  def funcionario_nombre
    self.funcionario.try(:nombre)
  end

  def apercibimiento?
    apercibimiento ? "si" : "no"
  end
  
  def nombre
    self.descripcion
  end
  
  def destinatarios_email
    [self.identificador_email,self.funcionario_email,self.registrador_email,self.superior_email].compact
  end
   
  def nombre_para_plan_accion
    'Hecho Significativo '<<self.hecho_nombre
  end

  def retiro_premio?
    !self.premiacion_id.nil?
  end

  def self.reporte_individual(params)
    reporte={:funcionario=>nil,:inicio=>nil,:fin=>nil,:datos=>[],:resumen=>{}}
    reporte[:funcionario]=Usuario.find(params[:funcionario][:id])
    inicio=params[:inicio].gsub("/","-").to_date
    fin=params[:fin].gsub("/","-").to_date
    reporte[:datos]=reporte[:funcionario].incidentes.por_periodo(inicio,fin)
    reporte[:resumen] = Hash.new()
    unless reporte[:datos].empty?
      reporte[:resumen]["apercibimientos"] = (reporte[:datos].select {|i| i.apercibimiento==true }).count
      reporte[:resumen]["suspenciones"] = (reporte[:datos].select {|i| i.suspecion_dias.to_i > 0}).count
      reporte[:resumen]["positivos"] = reporte[:datos].select{|i| i.puntos>0}.count
      reporte[:resumen]["negativos"] = reporte[:datos].select{|i| i.puntos<0}.count
      reporte[:resumen]["total_positivos"] = reporte[:datos].select{|i| i.puntos>0}.sum(&:puntuacion)
      reporte[:resumen]["total_negativos"] = reporte[:datos].select{|i| i.puntos<0}.sum(&:puntuacion)
      reporte[:resumen]["total_resultado"] = reporte[:resumen]["total_negativos"]+reporte[:resumen]["total_positivos"]
      reporte[:resumen]["inicio"]=params[:inicio]
      reporte[:resumen]["fin"]=params[:fin]
    end
    reporte
  end

  def cosumir_puntos
#    if self.retiro_premio
#      consumir_puntos_de = self.funcionario.incidentes.para_consumir_puntos(self.fecha).map(&:id)
#      Incidente.update_all(['retiro_premio = ?',self.retiro_premio],['id in (?)',consumir_puntos_de]) unless consumir_puntos_de.empty?
#    end
  end

  def reconocimiento_index
    "#{funcionario.sucursal_id}-#{funcionario.area.id}"
  end
end
